home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Apple II Magazines (PO)
/
Nibble Volume 10, No. 12 (1989-12)(MindCraft Publishing)(Side A).zip
/
Nibble Volume 10, No. 12 (1989-12)(MindCraft Publishing)(Side A).po
/
TDIVE.BIN.S
< prev
next >
Wrap
Text File
|
1996-12-24
|
23KB
|
928 lines
***************************
* DDIVER.BIN SOURCE CODE *
* by Robert Lavelock *
* and John Romero *
* Copyright(c) 1989 *
* MindCraft Publ. Corp. *
* Merlin Pro assembler *
***************************
*
* Variable block:
*
LEVEL = 768 ;game level
KORJ = LEVEL+1 ;keyboard or joystick flag
WAIT = KORJ+1 ;skill level
CTRLS = WAIT+1 ;sound on/off flag
DRAWX = CTRLS+2 ;xdrawing variables
DRAWY = DRAWX+1
NUM = DRAWY+1
RCODE = NUM+1 ;return-code to Basic
CHESTX = RCODE+1 ;treasure chest coords
CHESTY = CHESTX+1
MEN = CHESTY+1 ;# of frogmen
SCORE0 = MEN+1 ;score variables
SCORE1 = SCORE0+1
CHALIVE = SCORE1+1 ;chest gone/still onscreen flag
TONE = CHALIVE+1
LENGTH = TONE+1
KUP = LENGTH+1
KDN = KUP+1
KLF = KDN+1
KRT = KLF+1
*
VERT = 249 ;drawing variables
DEPT = VERT+1
HORZ = DEPT+1
WIDT = HORZ+1
TEMP = WIDT+1
HP = 0
SH = 254
********************************
*
* Vectors called from Basic:
*
********************************
ORG $8000
********************************
XDRAW JMP DRAW
INIT JMP GAMESET
CONT JMP CONTINUE
ERASE JMP ERASEALL
STATS JMP PSTATS
ERASTEM JMP ERASESTEMS
BSOUND JMP VECSOUND
********************************
*
* Xdraw routine
*
********************************
DRAW LDX NUM
LDA SHPL,X ;point to shape address
STA SH
LDA SHPH,X
STA SH+1
LDX DRAWX
LDY DRAWY
DRAW0 STX HORZ ;xcoord
STY VERT ;ycoord
LDY #0
LDX #0
LDA (SH),Y ;get width of shape
STA WIDT
STA TEMP
INY
LDA (SH),Y ;get depth of shape
STA DEPT
INC SH
INC SH
DRAW1 JSR GET ;get screen-line address
JMP DRAW2
GET LDY VERT
LDA $6000,Y ;get line address from...
STA HP+1 ;...lookup tables
LDA $6100,Y
STA HP
LDY HORZ
RTS
DRAW2 CPY #40 ;shape onscreen?
BCS DRAW3 ;<-- no
LDA (SH,X) ;get shape byte...
EOR (HP),Y ;...xdraw it....
STA (HP),Y ;...store it on screen
DRAW3 INC SH
INY
DEC WIDT
BNE DRAW2
LDA TEMP
STA WIDT
INC VERT
DEC DEPT
BNE DRAW1 ;finish xdrawing shape
RTS
********************************
BXDRAW JSR BSETUP ;setup shape pointers...
JMP DRAW0 ;...and xdraw it
BSETUP STX TEMP
TAX
LDA SHPL,X
STA SH
LDA SHPH,X
STA SH+1
LDX TEMP
RTS
SHPH HEX 6363636363636300 ;<--pointers to shapes
SHPL HEX 002040587080A000
********************************
*
* Game setup
*
********************************
GAMESET
LDX #19
STX FX ;frogman's xcoord = 19
STX BCYCLE
LDY #46
STY FY ;ycoord = 46
LDA #0
STA FSHAPE ;zero some variables...
STA FXV
STA SINDEX
STA FYV
STA CNTIME
STA GONECHEST
STA CHALIVE
STA BONUS
JSR BXDRAW ;draw frogman (with shape #0)
LDA #3
STA FALIVE ;frogman-alive = yes
STA FSPEED
STA FSCYCLE
RTS
********************************
*
* Start (or continue) game
*
********************************
CONTINUE
LDA #0
STA RCODE ;clear return-code
MAIN JSR CONTROL ;read keyboard
JSR JOYX ;read joystick x-axis
JSR FMOVE ;move frogman
JSR AMOVE ;move sea critters
JSR GOTCHEST? ;got the treasure chest?
JSR NEXTLEVEL? ;go to the next level?
JSR JOYY ;read joystick y-axis
JSR FROGVSSEA ;check frogman vs. sea critters
JSR FEXPLODE ;frogman "explosion" routine
JSR CHESTNOISE ;noise for getting chest
JSR BLINK ;blink the background stars
JSR MINECHECK ;check frogman vs. mines
JSR DECBON ;decrement the BONUS counter
LDA WAIT
JSR $FCA8 ;wait a bit
LDA RCODE ;exit to Basic?
BEQ MAIN ;<--no
SED ;if so, add 1 to level counter
LDA LEVEL
CLC
ADC #1
STA LEVEL
CLD
LDX FX
LDY FY
LDA FSHAPE
JMP BXDRAW ;...then erase frogman and RTS
********************************
*
* Control routine
*
********************************
CONTROL LDA KORJ
CMP "J"
BEQ CONTROL0
LDA #10
JSR $FCA8
CONTROL0 LDA $C000 ;get keypress
BPL CONT0 ;<--goto CONT0 if no keypress
CMP KUP ;move up?
BNE CONT1
YUP DEC FYV ;fyv = fyv - 1
LDA FYV
BPL CONT0
CMP #-5 ;if fyv < -5 then fyv = -5
BCS CONT0
LDA #-5
STA FYV
CONT0 BIT $C010 ;clear key strobe
RTS
CONT1 CMP KDN ;move down?
BNE CONT2
YDN INC FYV ;fyv = fyv + 1
LDA FYV
BMI CONT0
CMP #5 ;if fyv > 5 then fyv = 5
BEQ CONT0
BCC CONT0
LDA #5
STA FYV
BIT $C010
RTS
CONT2 CMP KLF ;move left?
BNE CONT3
LDA FXV ;fxv = fxv - 1
SEC
SBC #1
STA FXV
CMP #-2 ;if fxv = -2 then fxv = -1
BNE CONT0
LDA #-1
STA FXV
BIT $C010
RTS
CONT3 CMP KRT ;move right?
BNE CONT4
LDA FXV ;fxv = fxv + 1
CLC
ADC #1
STA FXV
CMP #2 ;if fxv = 2 then fxv = 1
BNE CONT0
LDA #1
STA FXV
BIT $C010
CONT3A RTS
CONT4 CMP #147 ;CTRL-S?
BNE CONT5 ;<--no
LDA #1
SEC
SBC CTRLS
STA CTRLS ;CTRLS = 1 - CTRLS
LDX #50
LDY #50
JSR SOUND ;make a sound
JMP CONT0
CONT5 CMP #155 ;ESC?
BNE CONT6 ;<--no
BIT $C010
CONT5A LDA $C000 ;get keypress
BPL CONT5A
CMP #155 ;another ESC?
BEQ CONT3A
JMP CONT0 ;if so,don't clear strobe
CONT6 CMP #145 ;CTRL-Q?
BNE CONT3A ;<--no
LDA #3
STA RCODE ;return code = quit
RTS
********************************
*
* Move Frogman
*
********************************
FMOVE LDA FALIVE ;frogman alive?
BNE FMOVE00 ;<--yes
RTS
FMOVE00 DEC FSPEED ;can frogman move now?
BEQ FMOVE0 ;<--yes
RTS
FMOVE0 LDA #3 ;reset move timer
STA FSPEED
LDX FX
LDY FY
LDA FSHAPE
JSR BXDRAW ;erase frogman
*
LDA FX ;fx = fx + fxv
CLC
ADC FXV
STA FX
CMP #-1 ;if fx = -1 then FMOVE1
BEQ FMOVE1
CMP #39 ;if fx > 38 then fx = 38:fxv = 0
BCC FMOVE2
LDA #38
STA FX
LDA #0
STA FXV
JMP FMOVE2 ;...goto FMOVE2
FMOVE1 LDA #0 ;fx = 0:fxv = 0
STA FX
STA FXV
FMOVE2 LDA FY ;fy = fy + fyv
CLC
ADC FYV
STA FY
CMP #46 ;if fy < 46 then fy = 46:fyv = 0
BCS FMOVE3
LDA #46
STA FY
LDA #0
STA FYV
JMP FMOVE4 ;...goto FMOVE4
FMOVE3 CMP #137 ;if fy > 137 then fy = 137:fyv=0
BCC FMOVE4
LDA #137
STA FY
LDA #0
STA FYV
FMOVE4 DEC FSCYCLE ;if fscycle > 0 then FMOVE5
BNE FMOVE5
LDA #3 ;reset fscycle to 3
STA FSCYCLE
LDA #1 ;and switch frogman shapes
SEC
SBC FSHAPE
STA FSHAPE
FMOVE5 LDA CTRLS
BEQ FMOVE6
BIT $C030
FMOVE6 LDX FX
LDY FY
LDA FSHAPE
JMP BXDRAW ;draw frogman and RTS
********************************
*
* Move sea critters
*
********************************
AMOVE LDA #19
STA INDEX
AMV1 LDX INDEX
LDA AALIVE,X ;is critter(X) alive?
BNE AMV3 ;<--yes
AMV2 DEC INDEX ;next critter
BPL AMV1 ;until done
RTS
AMV3 DEC ASPEED,X ;cycle delay for speeds
BMI AMV3A
JMP AMV2
AMV3A LDA ASPEED1,X ;restore original delay cntr.
STA ASPEED,X
JSR AXDRAW ;erase critter(X)
LDX INDEX
LDA AX,X
CLC
ADC AXV,X ;add x-velocity
STA AX,X
CMP #255 ;check screen limits
BNE AMV4
LDA #38
STA AX,X
JMP AMV5
AMV4 CMP #39
BNE AMV5
LDA #0
STA AX,X
AMV5 JSR AXDRAW ;draw critter(X)
LDX INDEX
LDA AX,X
TAX
INX
LDY #4
JSR SOUND ;make a noise
JMP AMV2 ;next critter!
********************************
AXDRAW LDY AY,X ;xdrawing routine
LDA ASHAPE,X
PHA
LDA AX,X
TAX
PLA
JMP BXDRAW
********************************
*
* Check to see if Frogman got
* the treasure chest. Erase if so.
*
********************************
GOTCHEST?
LDA FALIVE ;if frogman alive?
BNE GOT0 ;<--yes
RTS
GOT0 LDA GONECHEST ;did he get the chest yet?
BEQ GOT ;<--no
RTS
GOT LDA FX ;check x-coordinates
SEC
SBC CHESTX
BEQ GOT1 ;<--right on target
CMP #1
BEQ GOT1 ;<--little to the left
CMP #-1
BEQ GOT1 ;<--little to the right
RTS
GOT1 LDA FY ;if fy>125 then gotchest!
CMP #125
BCS GOT2
RTS
GOT2 LDX CHESTX
LDY CHESTY
LDA #2
JSR BXDRAW ;erase chest
LDA #1
STA GONECHEST ;<--chest is gone
STA CHALIVE ;<--chest is "dead"
LDA #9
STA CNTIME ;make a noise
SED
LDA LEVEL
STA TEMP
GOT2A LDA SCORE0 ;add 10*level to score
CLC
ADC #$10
STA SCORE0
BCC GOT3
LDA SCORE1
CLC
ADC #1
STA SCORE1
GOT3 LDA TEMP
SEC
SBC #1
STA TEMP
BNE GOT2A
CLD
LDA #$50 ;set BONUS counter to 50
STA BONUS
JMP PSTATS ;and print new score
********************************
*
* Check to see if Frogman swam
* back up to the ship with the
* treasure chest.
*
********************************
NEXTLEVEL?
LDA GONECHEST ;is the chest gone?
BNE NEXT1 ;<--yes
RTS
NEXT1 LDA FX ;is frogman directly under ship?
CMP #19
BEQ NEXT2
RTS
NEXT2 LDA FY
CMP #46
BEQ NEXT3 ;<--yes
RTS
NEXT3 LDA #1 ;return code #1 = next level!
STA RCODE
SED
LDA SCORE0
CLC
ADC BONUS ;add BONUS to score
STA SCORE0
BCC NEXT4
LDA SCORE1
CLC
ADC #1
STA SCORE1
NEXT4 CLD
JMP PSTATS ;and print it
********************************
*
* Count down the BONUS points!
*
********************************
DECBON LDA BONUS ;count down BONUS points?
BNE DECBON1 ;<--yes
RTS
DECBON1 LDA FSPEED ;can frogman move? (be fair now)
CMP #1
BEQ DECBON2 ;<--yes
RTS
DECBON2 SED ;subtract 1 from BONUS
LDA BONUS
SEC
SBC #1
STA BONUS
CLD
RTS
********************************
*
* Erase all sea critters
*
********************************
ERASEALL
LDA #19
STA INDEX ;all 20 possible critters
ERASE1 LDX INDEX
LDA AALIVE,X ;is critter(X) alive?
BNE ERASE3 ;<--yes
ERASE2 DEC INDEX ;next critter
BPL ERASE1
JMP ERASE4 ;GOTO ERASE4
ERASE3 JSR AXDRAW ;erase critter(X)
JMP ERASE2
*
ERASE4 LDA #9
STA INDEX ;erase all 10 possible mines
ERASE5 LDX INDEX
LDA MALIVE,X ;mine(X) alive?
BNE ERASE7 ;<--yes
ERASE6 DEC INDEX ;next mine
BPL ERASE5
RTS
ERASE7 LDY MINEY,X
LDA MINEX,X
TAX
LDA #6
JSR BXDRAW ;erase mine(X)
JMP ERASE6
********************************
*
* Erase mine stems
*
********************************
ERASESTEMS
LDA #9
STA INDEX ;all 10 possible stems,too
ESTEM1 LDX INDEX
LDA MALIVE,X
BNE ESTEM3
ESTEM2 DEC INDEX
BPL ESTEM1
RTS
ESTEM3 LDX #0 ;HCOLOR=0
JSR $F6F0
LDX INDEX
LDY STEMY,X
LDA STEMX,X
TAX
TYA
LDY #0
JSR $F457 ;HPLOT stemx,stemy
LDX INDEX
LDA STEMX,X
LDY #144
LDX #0
JSR $F53A ;HPLOT TO stemx,144
JMP ESTEM2
********************************
*
* Read joystick X axis
*
********************************
JOYX LDA KORJ ;joystick mode?
CMP #"J"
BEQ JOYX1 ;<--yes
RTS
JOYX1 LDX #0 ;read paddle 0
JSR $FB1E
TYA
CMP #70 ;if padx<70 then fxv=-1
BCS JOYX2
LDA #-1
STA FXV
JMP PAUSE
JOYX2 CMP #180 ;if padx>180 then fxv=1
BCC JOYX3
LDA #1
STA FXV
RTS
JOYX3 LDA #0 ;if padx>69 and padx<181,fxv=0
STA FXV
********************************
PAUSE LDA #50
JMP $FCA8
********************************
*
* Read joystick Y axis
*
********************************
JOYY LDA KORJ ;same as x-axis
CMP #"J"
BEQ JOYY1
RTS
JOYY1 LDX #1 ;read paddle 1
JSR $FB1E
TYA
CMP #70
BCS JOYY2
JSR PAUSE
JMP YUP
JOYY2 CMP #180
BCC JOYY3
JMP YDN
JOYY3 LDA #0
STA FYV
JMP PAUSE
********************************
*
* Check Frogman vs Sea Critters
*
********************************
FROGVSSEA
LDA FALIVE ;frogman alive?
BNE FS0 ;<--yes
RTS
FS0 LDA #19 ;check all 20 possible critters
STA INDEX
FS1 LDX INDEX
LDA AALIVE,X ;critter(X) alive?
BNE FS3 ;<--yes
FS2 DEC INDEX
BPL FS1
RTS
FS3 LDA FX ;if fx-ax(X) >-2 and < 2, FS4
SEC
SBC AX,X
CMP #-2
BCS FS4
CMP #2
BCC FS4
JMP FS2
FS4 LDA FY ;if fy-ay(X) >-10 and <5, FS5
SEC
SBC AY,X
CMP #-10
BCS FS5
CMP #5
BCC FS5
JMP FS2
FS5 LDA #0
STA FALIVE ;frogman is "dead"
LDA #20
STA XTIME ;explode 20 cycles
LDA AXV,X
STA EXXV
LDA #0
STA EXYV ;set explosion velocities
RTS
********************************
*
* Frogman's death scene
*
********************************
FEXPLODE
LDA FALIVE ;frogman alive?
BEQ FEX ;<--no
RTS
FEX BIT -16302 ;full-screen
BIT -16299 ;hires page 2
JSR XNOISE ;make a noise
BIT -16300 ;hires page 1
JSR XNOISE ;make a noise
LDX FX
LDY FY
LDA FSHAPE
JSR BXDRAW ;erase frogman
LDA FX
CLC
ADC EXXV ;move frogman according to...
STA FX
LDA FY
CLC
ADC EXYV ;explosion velocities
STA FY
LDX FX
LDY FY
LDA FSHAPE
JSR BXDRAW ;draw frogman
DEC XTIME
BEQ FEX1
BIT -16301 ;split text/graphics mode
RTS
FEX1 LDA #1 ;frogman = alive
STA FALIVE
LDA #0
STA FXV
STA FYV
LDX FX
LDY FY
LDA FSHAPE
JSR BXDRAW ;erase him
LDA GONECHEST ;if chest is still there, put
BNE FEX2 ;...frogman at top of water
LDY #46
JMP FEX3
FEX2 LDY #136 ;if chest is gone, put him on
FEX3 STY FY ;...the bottom of the water
LDA FSHAPE
BIT -16301 ;text/graphics mode
LDX FX
JSR BXDRAW ;draw frogman
SED
LDA MEN
SEC
SBC #1
STA MEN ;FROGMEN=FROGMEN - 1
CLD
PHP ;save processor status
JSR PSTATS ;print game status
PLP ;get processor status
BCS FEX4 ;if FROGMEN > 0 then all is o.k.
LDA #2
STA RCODE ;...else GAME OVER! return code
FEX4 RTS
********************************
*
* Print statistics
*
********************************
PSTATS LDY #20
LDX #8
JSR TABS ;htab 9:vtab 21
LDA MEN
JSR $FDDA ;print MEN
LDY #20
LDX #25
JSR TABS ;htab 26:vtab 21
LDA LEVEL
JSR $FDDA ;print LEVEL
LDY #21
LDX #6
JSR TABS ;htab 7:vtab 22
LDA SCORE1
JSR $FDDA
LDA SCORE0
JMP $FDDA ;print SCORE0,1
********************************
TABS STX 36
STY 37
JMP $FC22 ;validate tab changes
********************************
*
* Got-Chest noise
*
********************************
CHESTNOISE
LDA CNTIME ;make a chest-noise?
BNE CHN ;<--yes
RTS
CHN LDY CNTIME ;get pointer
LDX CNTONE-1,Y ;get note
LDA CNLENG-1,Y ;get length of note
TAY
DEC CNTIME
JMP SOUND ;make a sound
CNTONE DFB 10,30,50,60,70,60,50,30,10
CNLENG DFB 50,40,30,20,10,20,30,40,50
********************************
*
* Sound routine
*
********************************
VECSOUND
LDX TONE ;for calling from Basic
LDY LENGTH
SOUND
LDA CTRLS ;sound off?
BEQ SOUND3 ;<--yes
STX TEMP ;temp=x
SOUND1 LDX TEMP ;x=temp
SOUND2 DEX ;x=x-1
BNE SOUND2 ;if x>0 then SOUND2
BIT $C030 ;click speaker
DEY ;length=length - 1
BNE SOUND1 ;if length>0 then SOUND1
SOUND3 RTS
********************************
*
* Blink the twilight stars...
*
********************************
BLINK DEC BCYCLE ;o.k. to blink next star?
BEQ BLINK0 ;<--yes
RTS
BLINK0 LDA #5 ;keep blink for 5 cycles
STA BCYCLE
LDA #32
STA 230 ;set hires page 1
LDX #0
JSR $F6F0 ;HCOLOR = 0
LDY SINDEX
LDX STARX,Y
LDA STARY,Y
LDY #0
JSR $F457 ;HPLOT starx(Y),stary(Y)
LDX #3
JSR $F6F0 ;HCOLOR = 3
INC SINDEX ;next star
LDY SINDEX
CPY #50 ;if SINDEX=50 then SINDEX=0
BCC BLINK1
LDY #0
STY SINDEX
BLINK1 LDX STARX,Y
LDA STARY,Y
LDY #0
JMP $F457 ;HPLOT starx(Y),stary(Y)
********************************
*
* Death noise
*
********************************
XNOISE
LDA CTRLS ;sound on?
BEQ :LOOP4 ;<--no
LDA #-10
STA TEMP
:LOOP LDX TEMP
LDA $F800,X ;get tones from somewhere...
LDY #4
:LOOP1 TAX
:LOOP2 DEX
BNE :LOOP2
BIT $C030 ;and make quick sound-bursts
DEY ;...for explosion
BNE :LOOP1
INC TEMP
BNE :LOOP
:LOOP3 RTS
:LOOP4 LDA #75 ;if sound off, wait a bit so
JMP $FCA8 ;...player can see screen-mess!
********************************
*
* Check Frogman vs. Mines
*
********************************
MINECHECK
LDA FALIVE ;is frogman alive?
BNE MINE0 ;<--yes
RTS
MINE0 LDA #9
STA INDEX ;check all 10 possible mines
MINE1 LDX INDEX
LDA MALIVE,X
BNE MINE3
MINE2 DEC INDEX
BPL MINE1
RTS
MINE3 LDA FX
SEC
SBC MINEX,X ;check FX vs MINEX(X)
BEQ MINE4
CMP #1
BEQ MINE4
CMP #-1
BNE MINE2
MINE4 LDA FY
SEC
SBC MINEY,X ;check FY vs MINEY(X)
BEQ MINE5
CMP #-10
BCS MINE5
CMP #7
BCS MINE2
MINE5 LDA #0
STA FALIVE ;frogman = "dead"
STA MALIVE,X ;mine = "dead" also
LDA #0
STA EXXV
LDA #-4
STA EXYV ;throw frogman up!
LDA #20
STA XTIME ;explode for 20 cycles
********************************
STX INDEX1
LDX FX
LDY FY
LDA FSHAPE
JSR BXDRAW
JSR ERASEALL ;erase critters & mines
LDX #0
JSR $F6F0
LDX INDEX1
LDY STEMY,X
LDA STEMX,X
TAX
TYA
LDY #0
JSR $F457
LDX INDEX1
LDA STEMX,X
LDX #0
LDY #144
JSR $F53A ;erase mine stem(X)
LDX INDEX1
LDY MINEY,X
LDA MINEX,X
TAX
LDA #6
JSR BXDRAW ;erase mine(X)
LDX FX
LDY FY
LDA FSHAPE
JSR BXDRAW
JMP ERASEALL ;redraw critters & mines
*******************************
*
* Main variables start at $8A00
*
TR ON
ORG $8A00
AALIVE DS 20
AX DS 20
AY DS 20
AXV DS 20
ASHAPE DS 20
ASPEED DS 20
ASPEED1 DS 20
FX DS 1
FY DS 1
FXV DS 1
FYV DS 1
FSHAPE DS 1
FSCYCLE DS 1
FSPEED DS 1
INDEX DS 1
GONECHEST DS 1
FALIVE DS 1
XTIME DS 2
CNTIME DS 1
STARX DS 50
STARY DS 50
SINDEX DS 1
BCYCLE DS 1
MINEX DS 10
MINEY DS 10
MALIVE DS 10
EXXV DS 1
EXYV DS 1
INDEX1 DS 1
STEMX DS 10
STEMY DS 10
BONUS DS 1
LST OFF